package com.iwhalecloud.bss.kite.cucc.order.flow.handles;

import com.iwhalecloud.bss.kite.common.constant.OrderFlowConsts;
import com.iwhalecloud.bss.kite.common.util.KiteMapUtils;
import com.iwhalecloud.bss.kite.cucc.order.flow.FlowEngine;
import com.iwhalecloud.bss.kite.dataservice.cache.TacheTypeCache;
import com.iwhalecloud.bss.kite.dataservice.entity.OrderItem;
import com.iwhalecloud.bss.kite.dataservice.entity.flow.Flow;
import com.iwhalecloud.bss.kite.dataservice.entity.flow.TacheType;
import com.iwhalecloud.bss.kite.dataservice.mapper.order.OrderItemMapper;
import com.ztesoft.bss.common.util.SpringUtil;
import tk.mybatis.mapper.entity.Example;

import java.time.LocalDateTime;

/**
 * @author yu.baocheng@iwhalecloud.com<br>
 * @version 1.0<br>
 * @taskId <br>
 * @CreateDate 2020/3/1 7:45 下午 <br>
 * @since ZSmart_BSS_COC_R3.1<br>
 * <Description>
 * 订单流程引擎默认处理器
 * <br>
 */
public class DefaultTacheHandler implements TacheHandler {


    @Override
    public String commit(Flow flow) {
        return FlowEngine.commit(flow);
    }

    @Override
    public String execute(Flow flow) {
        // TODO 自动生成方法存根
        return null;
    }

    public String perform(Flow flow) {
        // TODO 自动生成方法存根
        before(flow);

        String tache_id = execute(flow);

        after(flow);

        return tache_id;
    }

    /**
     * 执行环节处理器前需要执行的一些操作。如删除上一环节队列表中的数据。 其它功能可按需要增加。
     * @param flow 流程环节实例对象 无返回值
     */
    protected void before(Flow flow) {
        // FlowEng.deletePreTacheQueue(flow); //删除上一环节队列数据.放在最后一个环节去删除所有队列表的数据
    }

    /**
     * 环节处理器执行完后，需要执行的操作，如修改order_item表中的Status和status_date字段。 其它操作按需增加。 入参： FlowVO 流程环节实例对象 无返回值。 抛出异常：FrameException
     */
    protected void after(Flow flow) {
        // add by AyaKoizumi 如果flow对象的skip_after字段为T，那么跳过当前after的策略
//        String skip = flow.getSkip_after();
//        if (skip != null && skip.equals("T")) {
//            return;
//        }

        /** 【BSS3.0入网检测】（by zhan.meiqing on 2018-3-5）修改内容： 获取缓存中的cust_id； **/
//        CommonData commonData = CommonData.getData();
//        String cust_id = "";
//        if (commonData != null) {
//            cust_id = commonData.getCust_id();
//        }

//        TacheTypeDAO tacheDao = new TacheTypeDAO();
        // 更新order_item中的status、status_date
//        String orderItemId = flow.getInstId();
//        HashMap<String, String> mapParam = new HashMap<String, String>();
//        mapParam.put(BTables.ORDER_ITEM.order_item_id, orderItemId);

        // 得到环节的tache_type_code
//        List list_tache_type = tacheDao.findByCond(" and tache_type_id = " + flow.getTache_type_id());
//        if (list_tache_type == null || list_tache_type.size() == 0)
//            return;

        TacheType tacheType = TacheTypeCache.get(flow.getTacheTypeId());

//      HashMap<String, String> mapTacheType = (HashMap<String, String>) list_tache_type.get(0);
        String tacheTypeCode = tacheType.getTacheTypeCode();

        // 开通差错环节需要特殊处理,可参考PFExpTacheHandler.java
        String orderItemStatus = "";
        if (OrderFlowConsts.TACHE_TYPE_CODE_ACTUALERR.equals(tacheTypeCode)) {
            // 获取订单项的状态？？？获取到的是空值
            orderItemStatus = KiteMapUtils.getString(OrderFlowConsts.TACHE_ORDERITEM_STATUS, tacheTypeCode + "|" + flow.getResult()); // 开通环节按环节编码和处理结果
        }
        else {
            orderItemStatus = KiteMapUtils.getString(OrderFlowConsts.TACHE_ORDERITEM_STATUS, tacheTypeCode);
        }
        //
        if (orderItemStatus == null || "".equals(orderItemStatus)) {
            return;
        }

        Example example = new Example(OrderItem.class);
        example.createCriteria()
            .andEqualTo("orderItemId", flow.getInstId())
            .andEqualTo("belongCustId", flow.getCustId());
        OrderItemMapper orderItemMapper = SpringUtil.getBean(OrderItemMapper.class);
//        OrderItem orderItem = orderItemMapper.selectByPrimaryKey(flow.getInstId());
        OrderItem orderItem = new OrderItem();
        orderItem.setStatusCd(orderItemStatus);
        orderItem.setStatusDate(LocalDateTime.now());
        orderItemMapper.updateByExampleSelective(orderItem, example);
//        String updateSql = SF.orderSql("SQL_UPDATE_ORDER_ITEM_STATUS");
//        // update order_item a set a.status_cd = ?, a.status_date = STR_TO_DATE(?,'%Y-%m-%d %H:%i:%S') where a.order_item_id = ? and a.belong_cust_id=?
//        SqlMapExe.getInstance().excuteUpdate(updateSql, new String[] {
//            orderItemStatus, FlowEng.getSysDate(), orderItemId, cust_id
//        });
    }
}
